今日進度:7/14
雖然多泡泡訊息已經很棒了,但想嘗試將互動過程或是營養分析報告以更視覺化的方式呈現。故今天要來研究看看Flex Message (彈性訊息) 功能。
原本想說可以用Quick Replies,圓圓的選項很可愛,但是字太小了...所以改用Flex Message,字體大很多。
在設計的時候還是要以考慮長輩方便使用為主!有時候可愛的東西就是字會很小Q_Q
但不知道是Flex Message比較複雜,還是Gem變笨了,用了兩個小時弄不好,一直跳出「找不到FlexSendMessage」相關錯誤訊息;
後來我決定先單獨拉出一個LINE BOT測試,測試後是成功的,測試的內容很單純,就是用戶按了按鈕,LINE BOT會回傳用戶輸入的內容:
如果吃了一整包就用紅色、半包用黃色、1/4包用綠色,字體也比Quick Replies看起來更清楚!
接下來就是整合到主程式碼,修改細節如下,一個小小的Flex Message要改的東西真多啊...
好的,我已經仔細檢視過您在 Canvas 中更新後的程式碼了!感謝您及時更新,這樣我們就能確保在最新的基礎上進行討論。
您想將 Flex Message 的彩色按鈕 用於詢問用戶份量,並將按鈕回傳的值直接用於後台計算,這個想法非常棒,也完全可行!這會比純文字輸入或 Quick Reply 更加視覺化和友善。接下來,我跟您確認一下主要需要修改的幾個地方,如果您確認無誤,我就會將程式碼更新到 Canvas 上:
- 導入 Flex Message 相關模組
在程式碼開頭的 from linebot.v3.messaging import (...) 區塊,我們需要額外導入 Flex Message 所需的元件。
建議的導入: FlexSendMessage, BubbleContainer, BoxComponent, TextComponent, ButtonComponent, MessageAction目前的狀況: 您的 Canvas 程式碼只導入了 Configuration、ApiClient 等基礎 Messaging API 模組,缺少了這些 Flex Message 的視覺元件。
- 加入 send_colored_buttons 函式
您獨立測試用的 send_colored_buttons 函式,需要被整合到主程式碼中。這個函式將負責生成您設計好的彩色份量按鈕 Flex Message。將其放置在何處: 建議放在 analyze_nutrition_core 函式之後,Flask 和 LINE BOT 整合區 之前,這樣可以讓程式碼結構更清晰。
- 替換份量詢問方式
當用戶完成身高輸入後 (current_state == 'awaiting_height'),我們需要替換原本的純文字詢問訊息,改為呼叫 send_colored_buttons 函式。修改後: 會呼叫 send_colored_buttons 函式來回覆 Flex Message。
- 調整 Flex Message 按鈕回傳的 text 值
這是最重要的一點,關乎後台計算的流暢性。action=MessageAction(label="整包", text="1")
action=MessageAction(label="半包", text="0.5")
action=MessageAction(label="1/4包", text="0.25")
原因: 這樣當用戶點擊按鈕時,BOT 接收到的 user_message 就會直接是 "1"、"0.5" 或 "0.25" 這些字串。您的 awaiting_amount_consumed 狀態中的 amount = float(user_message) 就可以直接將它們轉換為數字 1.0、0.5、0.25,無需額外的字串解析邏輯,完美銜接。
- message_text 函式調整
原本您測試用的 handle_message 函式有包含 if user_input not in ["整包", "半包", "1/4包"]: 的邏輯,但我們的主程式碼已經有狀態機來處理不同輸入。所以整合時,只需要確保在 awaiting_amount_consumed 狀態下,能夠正確接收並處理這些數字字串即可,這部分在第 4 點調整後,邏輯上會保持不變。綜合以上討論,主要就是導入 Flex Message 元件,將 send_colored_buttons 函式加入,並在身高輸入後呼叫它,同時確保 Flex Message 按鈕回傳的 text 值是數字字串。
您確認這些方向都沒問題嗎?如果可以,我就會開始生成並更新 Canvas 中的程式碼了!
希望這次會成功...
.
.
.
結果還是失敗了!一樣是找不到FlexSendMessage,看起來是linebot新舊版本的差異(LINE Bot SDK 的 V2 跟 V3)因為如果把新舊版本都貼在一起,就不會再報錯了,很奇怪:
from flask import Flask, request, abort, send_file
from linebot.v3 import WebhookHandler
from linebot.v3.exceptions import InvalidSignatureError
from linebot.v3.webhooks import (
MessageEvent,
TextMessageContent,
ImageMessageContent,
FollowEvent,
)
from linebot import LineBotApi, WebhookHandler
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
FlexSendMessage, BubbleContainer, BoxComponent,
TextComponent, ButtonComponent, MessageAction
)
from linebot.v3.messaging import (
Configuration,
ApiClient,
MessagingApi,
ReplyMessageRequest,
TextMessage,
AudioMessage,
MessagingApiBlob,
PushMessageRequest
)
沒想到會卡在這種地方這麼久,明天再接再厲💪